/*
 * Licensed to the Tai Ping Jin Ke
 *
 * Copyright (c) 2022 .
 * All rights reserved.
 * 项目名称：太平金科-基础组件封装层-对象存储服务OSS-核心依赖
 * 版权说明：本软件属太平金融科技服务(上海)有限公司所有，在未获得太平金融科技服务(上海)有限公司正式授权情况下，任何企业和个人，不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。
 */
package com.taipingframework.boot.minio.bucket.policy;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.io.Serializable;
import java.util.Map;
import java.util.List;

/**
 * 策略授权语句，描述策略的详细信息，包含Effect（效果）、Action（动作）、Principal（用户）、Resource（资源）和Condition（条件）。
 * 其中，Condition为可选。
 */
@Builder
@ToString
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
public class PolicyStatement implements Serializable {

    /**
     * Action（动作）
     * <p>
     * 对资源的具体操作权限，格式为：服务名:资源类型:操作，
     * 支持单个或多个操作权限，支持通配符号*，通配符号表示所有。
     * 例如 s3:GetObject ，表示获取对象
     */
    @JsonProperty("Action")
    private List<String> action;

    /**
     * Effect（效果）
     * <p>
     * 作用包含两种：Allow（允许）和Deny（拒绝），
     * 系统预置策略仅包含允许的授权语句，自定义策略中可以同时包含允许和拒绝的授权语句，当策略中既有允许又有拒绝的授权语句时，遵循Deny优先的原则。
     */
    @JsonProperty("Effect")
    private String effect;

    /**
     * Principal（用户）
     */
    @JsonProperty("Principal")
    private Map<String, List<String>> principal;

    /**
     * Resource（资源）
     * <p>
     * 策略所作用的资源，支持通配符号*，通配符号表示所有。
     * 在JSON视图中，不带Resource表示对所有资源生效。
     * Resource支持以下字符：-_0-9a-zA-Z*./\，如果Resource中包含不支持的字符，请采用通配符号*。
     * 例如：arn:aws:s3:::my-bucketname/myobject*，表示minio中my-bucketname/myobject目录下所有对象文件。
     */
    @JsonProperty("Resource")
    private List<String> resource;

    public List<String> getAction() {
        return this.action;
    }

    public void setAction(List<String> action) {
        this.action = action;
    }

    public String getEffect() {
        return this.effect;
    }

    public void setEffect(String effect) {
        this.effect = effect;
    }

    public Map<String, List<String>> getPrincipal() {
        return this.principal;
    }

    public void setPrincipal(Map<String, List<String>> principal) {
        this.principal = principal;
    }

    public List<String> getResource() {
        return this.resource;
    }

    public void setResource(List<String> resource) {
        this.resource = resource;
    }

}
